package com.bestcem.xm.user.grpc.client;

import com.bestcem.xm.common.core.constant.GrpcClientNames;
import com.bestcem.xm.om.grpc.v1.services.*;
import com.bestcem.xm.user.grpc.client.convert.IndustryGrpcConvert;
import com.bestcem.xm.user.grpc.client.dto.IndustryDTO;
import com.zy.dp.proto.base.v1.Code;
import lombok.extern.slf4j.Slf4j;
import net.devh.boot.grpc.client.inject.GrpcClient;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 行业 grpc service
 *
 * @author wangyunyun <yunyun.wang@idiaoyan.com>
 * @version v1.0
 * @date 2022/3/10 14:56
 */
@Slf4j
@Service("userIndustryGrpcService")
public class IndustryGrpcService {

    @GrpcClient(GrpcClientNames.DS_USER)
    private IndustryServiceGrpc.IndustryServiceBlockingStub stub;

    @Resource
    private IndustryGrpcConvert industryGrpcConvert;

    /**
     * 通过行业code获取行业信息
     *
     * @param industryCode
     * @return IndustryDTO
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @version v1.0
     * @date 2022/3/10 14:58
     */
    public IndustryDTO getByCode(String industryCode) {
        // 校验参数
        if (StringUtils.isBlank(industryCode)) {
            return null;
        }
        // 设置请求参数
        GetUserIndustryInfoRequest request = GetUserIndustryInfoRequest.newBuilder().setCode(Integer.parseInt(industryCode)).build();
        // 请求
        GetUserIndustryInfoResponse response = null;
        try {
            response = stub.getUserIndustryInfo(request);
        } catch (Exception e) {
            log.error("获取行业信息。请求失败", e);
        }
        // 返回值处理
        if (response != null && Code.OK_VALUE == response.getStatus().getCodeValue()) {
            return industryGrpcConvert.getUserIndustryInfoRes2Dto(response);
        } else {
            log.error("获取行业信息。请求失败, response:{}", response != null ? response.toString() : null);
        }
        return null;
    }

    /**
     * 通过行业code和地区获取行业信息, 包括对应区域的销售邮箱
     *
     * @param industryCode 行业code
     * @param district     区域 不为空则返回特定区域的销售手机号和邮箱, 为空则返回默认销售邮箱和手机号
     * @return IndustryDTO
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/10 16:06
     */
    public IndustryDTO getByCodeAndDistrict(String industryCode, String district) {
        // 校验参数
        if (StringUtils.isBlank(industryCode)) {
            return null;
        }
        // 设置请求参数
        GetIndustryContactRequest.Builder builder = GetIndustryContactRequest
                .newBuilder()
                .setCode(Integer.parseInt(industryCode));
        if (StringUtils.isNotBlank(district)) {
            builder.setDistrict(district);
        }
        // 通过区域、行业id或行业code查询行业信息、对应区域的销售电话
        return this.getIndustryContact(builder.build());
    }

    /**
     * 通过行业id和地区获取行业信息
     *
     * @param industryId 行业code
     * @return IndustryDTO
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/10 16:13
     */
    public IndustryDTO getById(String industryId) {
        // 校验参数
        if (StringUtils.isBlank(industryId)) {
            return null;
        }
        // 设置请求参数
        GetIndustryRequest request = GetIndustryRequest.newBuilder().setId(industryId).build();
        // 通过行业ide查询行业信息
        GetIndustryResponse response = null;
        try {
            response = stub.getIndustry(request);
        } catch (Exception e) {
            log.error("通过行业ide查询行业信息请求失败", e);
        }
        // 返回值处理
        if (response != null && Code.OK_VALUE == response.getStatus().getCodeValue()) {
            return industryGrpcConvert.industryGrpc2Dto(response.getIndustry());
        } else {
            log.error("通过行业ide查询行业信息请求失败.response:{}", response != null ? response.toString() : null);
        }
        return null;
    }

    /**
     * 通过行业id获取行业信息, 包括对应区域的销售电话
     *
     * @param industryId
     * @return IndustryDTO
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/7/18 17:34
     */
    public IndustryDTO getIndustryContactById(String industryId) {
        // 校验参数
        if (StringUtils.isBlank(industryId)) {
            return null;
        }
        // 设置请求参数
        GetIndustryContactRequest request = GetIndustryContactRequest.newBuilder().setId(industryId).build();
        // 通过区域、行业id或行业code查询行业信息、对应区域的销售电话
        return this.getIndustryContact(request);
    }


    /**
     * 通过行业code和地区获取行业信息, 包括对应区域的销售电话
     *
     * @param industryId 行业code
     * @param district   区域
     * @return IndustryDTO
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/10 16:13
     */
    public IndustryDTO getByIdAndDistrict(String industryId, String district) {
        // 校验参数
        if (StringUtils.isBlank(industryId) || StringUtils.isBlank(district)) {
            return null;
        }
        // 设置请求参数
        GetIndustryContactRequest request = GetIndustryContactRequest.newBuilder().setId(industryId).setDistrict(district).build();
        // 通过区域、行业id或行业code查询行业信息、对应区域的销售电话
        return this.getIndustryContact(request);
    }

    /**
     * 通过查询条件获取行业信息
     *
     * @param industryDTO
     * @return List<IndustryDTO>
     * @author yanjishuo <jishuo.yan@idiaoyan.com>
     * @version v1.0
     * @date 2022/05/07 14:58
     */
    public List<IndustryDTO> getByCondition(IndustryDTO industryDTO) {
        // 设置请求参数
        ListIndustriesRequest request = industryGrpcConvert.dto2ListIndustriesReq(industryDTO);
        // 请求
        ListIndustriesResponse response = null;
        try {
            response = stub.listIndustries(request);
        } catch (Exception e) {
            log.error("通过查询条件批量一次性获取所有符合条件的Industry。请求失败", e);
        }
        // 返回值处理
        if (response != null && Code.OK_VALUE == response.getStatus().getCodeValue()) {
            return industryGrpcConvert.industryGrpcs2Dtos(response.getIndustriesList());
        } else {
            log.error("通过查询条件批量一次性获取所有符合条件的Industry。请求失败, response:{}", response != null ? response.toString() : null);
        }
        return Collections.emptyList();
    }

    /**
     * 通过区域、行业id或行业code查询行业信息、对应区域的销售电话
     *
     * @param request 行业grpc请求参数
     * @return IndustryDTO
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/5/12 17:45
     */
    private IndustryDTO getIndustryContact(GetIndustryContactRequest request) {
        // 通过区域、行业id或行业code查询行业信息、对应区域的销售电话
        GetIndustryContactResponse response = null;
        try {
            response = stub.getIndustryContact(request);
        } catch (Exception e) {
            log.error("通过区域、行业id或行业code查询行业信息、对应区域的销售电话。请求失败", e);
        }
        // 返回值处理
        if (response != null && Code.OK_VALUE == response.getStatus().getCodeValue()) {
            return industryGrpcConvert.getIndustryContactRes2Dto(response);
        } else {
            log.error("通过区域、行业id或行业code查询行业信息、对应区域的销售电话，response:{}", response != null ? response.toString() : null);
        }
        return null;
    }

    /**
     * 通过行业的默认销售邮箱
     *
     * @return com.bestcem.xm.user.grpc.client.dto.IndustryDTO
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/30 15:00
     */
    public List<String> getIndustrySalesEmails() {
        // 通过ip所在省+所属行业编码 获取行业以及销售通知邮箱
        // 设置请求参数
        GetIndustryContactRequest.Builder builder = GetIndustryContactRequest.newBuilder();
        // 通过区域、行业id或行业code查询行业信息、对应区域的销售电话
        IndustryDTO industryContact = this.getIndustryContact(builder.build());

        return industryContact != null ? industryContact.getSalesEmails() : new ArrayList<>();
    }
}
